gesturesingle: Implement GtkGesture::cancel better than GtkEventController:reset
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 12 Jun 2014 23:08:16 +0000 (01:08 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 12 Jun 2014 23:27:31 +0000 (01:27 +0200)
The former can be called individually on each sequence, and the latter will
always call the former on all currently active sequences, so only implementing
resetting on cancel() works for both cases. Also, chain up on subclasses
implementing cancel.

This fixes clicking on nautilus' file list after popping up a menu, as broken
grabs are one of those situations where sequences get cancelled individually,
the "current button" wasn't properly reset, and further clicks with button != 3
were ignored.

gtk/gtkgesturelongpress.c
gtk/gtkgesturemultipress.c
gtk/gtkgesturesingle.c

index f2971b3b3617a51d7df843fbd60af6f32532544c..09ac12df4a639b5ab97fbf16303556cddc96d4ba 100644 (file)
@@ -175,6 +175,14 @@ gtk_gesture_long_press_end (GtkGesture       *gesture,
   priv->cancelled = priv->triggered = FALSE;
 }
 
+static void
+gtk_gesture_long_press_cancel (GtkGesture       *gesture,
+                               GdkEventSequence *sequence)
+{
+  gtk_gesture_long_press_end (gesture, sequence);
+  GTK_GESTURE_CLASS (gtk_gesture_long_press_parent_class)->cancel (gesture, sequence);
+}
+
 static void
 gtk_gesture_long_press_sequence_state_changed (GtkGesture            *gesture,
                                                GdkEventSequence      *sequence,
@@ -209,7 +217,7 @@ gtk_gesture_long_press_class_init (GtkGestureLongPressClass *klass)
   gesture_class->begin = gtk_gesture_long_press_begin;
   gesture_class->update = gtk_gesture_long_press_update;
   gesture_class->end = gtk_gesture_long_press_end;
-  gesture_class->cancel = gtk_gesture_long_press_end;
+  gesture_class->cancel = gtk_gesture_long_press_cancel;
   gesture_class->sequence_state_changed =
     gtk_gesture_long_press_sequence_state_changed;
 
index 1f499768fd9730a3572ef5d0577e178e5d9c6ca4..7b0067164cff1c24c8400fe3d76da3a8cd540702 100644 (file)
@@ -279,6 +279,7 @@ gtk_gesture_multi_press_cancel (GtkGesture       *gesture,
                                 GdkEventSequence *sequence)
 {
   _gtk_gesture_multi_press_stop (GTK_GESTURE_MULTI_PRESS (gesture));
+  GTK_GESTURE_CLASS (gtk_gesture_multi_press_parent_class)->cancel (gesture, sequence);
 }
 
 static void
index ac91851808ab83ab1ac1762c4d90e245b67346bb..d33f190292cf454f78283e33d4c57647574b70fa 100644 (file)
@@ -112,14 +112,15 @@ gtk_gesture_single_set_property (GObject      *object,
 }
 
 static void
-gtk_gesture_single_reset (GtkEventController *controller)
+gtk_gesture_single_cancel (GtkGesture       *gesture,
+                           GdkEventSequence *sequence)
 {
   GtkGestureSinglePrivate *priv;
 
-  priv = gtk_gesture_single_get_instance_private (GTK_GESTURE_SINGLE (controller));
-  priv->current_button = 0;
+  priv = gtk_gesture_single_get_instance_private (GTK_GESTURE_SINGLE (gesture));
 
-  GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->reset (controller);
+  if (sequence == priv->current_sequence)
+    priv->current_button = 0;
 }
 
 static gboolean
@@ -219,14 +220,16 @@ static void
 gtk_gesture_single_class_init (GtkGestureSingleClass *klass)
 {
   GtkEventControllerClass *controller_class = GTK_EVENT_CONTROLLER_CLASS (klass);
+  GtkGestureClass *gesture_class = GTK_GESTURE_CLASS (klass);
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->get_property = gtk_gesture_single_get_property;
   object_class->set_property = gtk_gesture_single_set_property;
 
-  controller_class->reset = gtk_gesture_single_reset;
   controller_class->handle_event = gtk_gesture_single_handle_event;
 
+  gesture_class->cancel = gtk_gesture_single_cancel;
+
   /**
    * GtkGestureSingle:touch-only:
    *